/*
 * @Descripttion: Redis缓存Service
 */
import { Service } from 'egg';

const LOGIN_PRE = 'FRESH_LOGIN_';

export default class CacheService extends Service {
  /**
   * @description: 写入redis
   * @param {string} key
   * @param {tystringpe} value
   * @param {number} seconds 过期时间
   * @return: void
   */
  async set(key, value, seconds) {
    const stringValue = JSON.stringify(value);
    if (this.app.redis) {
      if (!seconds) {
        await this.app.redis.set(key, stringValue);
      } else {
        await this.app.redis.set(key, stringValue, 'EX', seconds);
      }
    }
  }

  /**
   * @description: 读取redis
   * @param {string} key
   * @return: result
   */
  async get(key) {
    if (this.app.redis) {
      const data = await this.app.redis.get(key);
      if (!data) return;
      const result = JSON.parse(data);
      return result;
    }
  }

  /**
   * @description: 删除redis字段
   * @param {string} key
   * @return: result
   */
  async delete(key) {
    if (this.app.redis) {
      const result = await this.app.redis.del(key);
      return result;
    }
  }

  /**
   * @description: 已登录用户，用户名写入
   * @param {string} account 登录用户名
   * @return: void
   */
  async setLoginAccount(account) {
    const { config } = this.ctx.app;

    // 过期时间跟 session 过期时间一致
    const expires = config.session.maxAge / 1000; // ms to s
    const key = `${LOGIN_PRE}${account}`;
    // 用户登录时将用户名存入redis
    this.set(key, account, expires);
  }

  /**
   * @description: 已登录用户，用户名写入
   * @param {string} account 登录用户名
   * @return: void
   */
  async getLoginAccount(account) {
    const key = `${LOGIN_PRE}${account}`;
    return await this.get(key);
  }

  /**
   * @description: 已登录用户，用户名写入
   * @param {string} account 登录用户名
   * @return: void
   */
  async deleteLoginAccount(account) {
    const key = `${LOGIN_PRE}${account}`;
    // 用户登录时将用户名存入redis
    return await this.delete(key);
  }
}
